package fiuba.algo3.algoThieft.modelo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class Caso implements Deserializable {
    private Ladron ladron;
    private Mapa mapa;
    private List<ObjetoRobadoComun> objetosRobadosComunes;
    private List<ObjetoRobadoValioso> objetosRobadosValiosos;
    private List<ObjetoRobadoMuyValioso> objetosRobadosMuyValiosos;
    private ObjetoRobado objetoRobadoDelCaso;
    private List<Capital> rutaDelLadron;
	private boolean ladronArrestado; 

    public Caso(Ladron ladron,Personaje personaje) throws SAXException, IOException, ParserConfigurationException{
    	this.ladron = ladron;
    	this.mapa = new Mapa();
    	this.objetosRobadosComunes = new ArrayList<ObjetoRobadoComun>();
        this.objetosRobadosValiosos = new ArrayList<ObjetoRobadoValioso>();
        this.objetosRobadosMuyValiosos = new ArrayList<ObjetoRobadoMuyValioso>();
            
        Persistor persistor = new Persistor();
        persistor.deserializarDesdeElArchivo(this , "ObjetosRobados.xml" );
        
        this.objetoRobadoDelCaso = personaje.recibirObjetoRobadoARecuperar(this);
        this.rutaDelLadron = ladron.implementarEstrategiaDeEscape(this.objetoRobadoDelCaso);
        this.mapa.setPistasLadronDesconocido(this.rutaDelLadron);
        this.ladronArrestado = false;
            
    }

    public int getCantidadDeViajes() {  
    	//la cantidad de viajes es ruta.size()-1 
    	//porque la ruta contiene a la capital inicial
        return this.rutaDelLadron.size()-1;
    }
    
    public Capital getUbicacionInicial() {
        return this.rutaDelLadron.get(0);
    }
    
    public ObjetoRobadoComun getObjetoRobadoAleatorio (Novato novato){
        int indiceAleatorio = (int)(Math.random() * this.objetosRobadosComunes.size() - 1);
        return this.objetosRobadosComunes.get(indiceAleatorio);
    }
    
    public ObjetoRobadoComun getObjetoRobadoAleatorio (Detective detective){
        int indiceAleatorio = (int)(Math.random() * this.objetosRobadosComunes.size() - 1);
        return this.objetosRobadosComunes.get(indiceAleatorio);
    }
    
    public ObjetoRobadoValioso getObjetoRobadoAleatorio (Investigador investigador){
        int indiceAleatorio = (int)(Math.random() * this.objetosRobadosValiosos.size() - 1);
        return this.objetosRobadosValiosos.get(indiceAleatorio);
    }
    
    public ObjetoRobadoMuyValioso getObjetoRobadoAleatorio (Sargento sargento){
        int indiceAleatorio = (int)(Math.random() * this.objetosRobadosMuyValiosos.size() - 1);
        return this.objetosRobadosMuyValiosos.get(indiceAleatorio);
    }

    public boolean esUbicacionLadron(Capital ubicacion) {
        return ubicacion.equals(this.rutaDelLadron.get(this.getCantidadDeViajes()));
    }
    
    @Override
    public void deserializar(Document doc) {
        Element elementoComunes = (Element) doc.getElementsByTagName("ObjetosRobadosComunes").item( 0 );
        
        for ( int i=0 ; i < elementoComunes.getChildNodes().getLength() ; i++ ){
            this.objetosRobadosComunes.add
            (ObjetoRobadoComun.crearObjetoRobadoComun(this.mapa, elementoComunes.getChildNodes().item( i )));
        }
        
        Element elementoValiosos = (Element) doc.getElementsByTagName("ObjetosRobadosValiosos").item( 0 );
        for ( int i=0 ; i < elementoValiosos.getChildNodes().getLength() ; i++ ){
            this.objetosRobadosValiosos.add
            (ObjetoRobadoValioso.crearObjetoRobadoValioso(this.mapa, elementoValiosos.getChildNodes().item( i )));
        }
        
        Element elementoMuyValiosos = (Element) doc.getElementsByTagName("ObjetosRobadosMuyValiosos").item( 0 );
        for ( int i=0 ; i < elementoMuyValiosos.getChildNodes().getLength() ; i++ ){
            this.objetosRobadosMuyValiosos.add
            (ObjetoRobadoMuyValioso.crearObjetoRobadoMuyValioso(this.mapa, elementoMuyValiosos.getChildNodes().item( i )));
        }
    }
	public boolean elLadronFueArrestado() {
		
		return this.ladronArrestado;
	}

	public void intentarArrestar(Ladron sospechoso) {

		this.ladronArrestado = sospechoso.equals(this.ladron);
		
	}

	public String getSexoDelLadron() {
		return this.ladron.getSexo();
	}

	public ObjetoRobado getObjetoRobadoActual() {
		
		return this.objetoRobadoDelCaso;
	}
        
}
